from PIL import Image
from torch.utils.tensorboard import SummaryWriter
from torchvision import transforms

writer = SummaryWriter("../log/Logs")

img = Image.open("../images/pytorch.jpg")
print(img)  # 查看文件类型

# ToTensor的使用 -->像素变化
# ToTensor的使用
trans_totensor = transforms.ToTensor()  # 将PIL的img通过transforms中ToTensor的一个对象变成对象当中的一种方法，变成img_tensor的数据类型
img_tensor = trans_totensor(img)
writer.add_image("ToTensor", img_tensor)
writer.close()


# Normalize-->归一化-->变色
print(img_tensor[0][0][0])  # 一开始第一行第一列的像素的输出
# trans_norm = transforms.Normalize([0.5, 0.5, 0.5], [0.5, 0.5, 0.5])  # rgb三层-->提供三个标准差-->step1
# trans_norm = transforms.Normalize([1, 3, 5], [3, 2, 1])  # rgb三层-->提供三个标准差 -->step2
trans_norm = transforms.Normalize([6, 3, 2], [9, 3, 5])  # rgb三层-->提供三个标准差 -->step3
img_norm = trans_norm(img_tensor)
print(img_norm[0][0][0])  # 经过归一化之后的输出-->第一行第一列(0层0列)
# writer.add_image("Normalize", img_norm)  # 经过归一化以后的图片输出-->浏览器显示的更好看了！！！！-->step1
# writer.add_image("Normalize", img_norm, 1)  # 经过归一化以后的图片输出-->浏览器显示的更好看了！！！！-->变色了更严重-->step2
writer.add_image("Normalize", img_norm, 2)  # 经过归一化以后的图片输出-->浏览器显示的更好看了！！！！-->变色了更严重-->step3


# Resize -->等比缩放
print(img.size)
trans_resize = transforms.Resize((512, 512))

# img PIL --> resize -->img_resize PIL (img的数据类型为PIL，经过Resize变换，img_resize的数据类型仍为PIL)
img_resize = trans_resize(img)
print(img_resize)  # 查看输出是什么类型  --> 输出 --> <PIL.Image.Image image mode=RGB size=512x512 at 0x2577C261E50>
print(type(img_resize))  # 输出 --> <class 'PIL.Image.Image'>

# img_resize PIL -->ToTensor --> img_resize tensor (img的数据类型为PIL，经过ToTensor变换，img_resize的数据类型变为tensor)
img_resize = trans_totensor(img_resize)

writer.add_image("Resize", img_resize, 0)
print(img_resize)  # 查看返回的类型


# Compose -- resize -2 (resize的第二种使用方法)  --> 不改变高和宽的比例，只改变最小边和最长边之间的一个大小关系
trans_resize_2 = transforms.Resize(512)
# PIL --> PIL --> tensor (第一个输入是PIL的image，经过Resize变换,还是PIL的image，又因为totensor的输入也需要PIL的image-->运用tensor转换成tensor的数据类型)
# trans_compose = transforms.Compose([trans_resize_2, trans_totensor])  # Compose()中的参数需要的是一个列表，在Compose中，数据需要是 transforms类型 -->Compose([transforms参数1，transforms参数2,....])
trans_compose = transforms.Compose([trans_totensor, trans_resize_2])  # 22-04-18调换顺序也可以，不会报错
img_resize_2 = trans_compose(img)  # 此处传入的参数需要的是img，又是trans_resize_2的一个输入，所以需要的是PIL的img
writer.add_image("Resize", img_resize_2, 1)


# RandomCrop --> 随机裁剪
# trans_random = transforms.RandomCrop(400)  # -->512会报错，将其改小！！！ -->step1
trans_random = transforms.RandomCrop((400, 700))
trans_compose_2 = transforms.Compose([trans_random, trans_totensor])
for i in range(10):
    img_crop = trans_compose_2(img)
    # writer.add_image("RandomCrop", img_crop, i)  # -->step1
    writer.add_image("RandomCropHW", img_crop, i)  # 按照指定的HW（高和宽）进行裁取

writer.close()

